1. 概念
- Spring 的 DAO 异常体系建立在运行期异常的基础上,封装了源异常
- JDBC 数据访问流程:
- 准备资源
- 启动事务
- 在事务中执行具体数据访问操作
- 提交/回滚事务
- 关闭资源,处理异常
- Spring 将相同的数据访问流程固化到模板类中,把数据访问中固定和变化的部分分开,同时保证模板类是线程安全的。Spring 为不同的持久化技术都提供了简化操作的模板和回调。
- 数据库事务:原子性,一致性,隔离性和持久性(ACID)
- 5 类数据库并发问题:
- 脏读:A 事务读取到 B 事务尚未提交的数据
- 不可重复读:A 事务中读取到 B 事务已经提交的更新数据,即连续两次读取结果不同
- 幻读:A 事务读取 B 事务的==新增==数据
- 第一类更新丢失:A 事务撤销时覆盖了 B 事务的提交
- 第二类更新丢失:A 事务覆盖 B 事务已经提交的数据
- JDBC 默认情况下自动提交,即每条执行的 SQL 语句都对应一个事务,
AutoCommit = TRUE
- Spring基于
ThreadLocal
解决有状态的Connetion
的并发问题,事务同步管理器org.springframework.transaction.support.TransactionSynchronizationManager
使用ThreadLocal
为不同事务线程提供独立的资源副本 - Spring 事务管理基于 3 个接口:
TransactionDefinition
,TransactionStatus
和PlatformTransactionManager
- Spring 为不同持久化技术提供了从
TransactionSynchronizationManager
获取对应线程绑定资源的工具类,如DataSourceUtils.getConnection(DataSource dataSource)
。模板类在内部通过工具类访问TransactionSynchronizationManager
中的线程绑定资源 - Spring 通过事务传播行为控制当前的事务如何传播到被嵌套调用的目标服务接口方法中
- 使用
<tx:annotation-driven transaction-manager="txManager">
对标注@Transactional
注解的 bean 进行加工处理,织入事务管理切面 @Transactional
注解的属性- 事务传播行为:
propagation
,默认PROPAGATION_REQUIRED
,即如果当前没有事务,就新建一个事务;否则加入到当前事务 - 事务隔离级别:
isolation
,默认ISOLATION_DEFAULT
- 读写事务属性:
readOnly
- 超时时间:
timeout
- 回滚设置:
rollbackFor
,rollbackForClassName
,noRollbackFor
,noRollbackForClassName
- 事务传播行为:
- 在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中;如果在不同线程中,则工作在独立的事务中
- 特殊方法:
- 注解不能被继承,所以业务接口中的
@Transactional
注解不会被业务实现类继承;方法处的注解会覆盖类定义处的注解 - 对于基于接口动态代理的 AOP 事务,由于接口方法都是
public
的,实现类的实现方法必须是public
的,同时不能使用static
修饰符。因此,可以通过接口动态代理实施 AOP 增强、实现 Spring 事务的方法只能是public
或public final
的 - 基于 CGLib 动态代理实施 AOP 的时候,由于使用
final
、static
、private
的方法不能被子类覆盖,相应的,这些方法不能实施 AOP 增强,实现事务 - 不能被 Spring 进行 AOP 事务增强的方法不能启动事务,但是外层方法的事务上下文仍然可以传播到这些方法中
- 注解不能被继承,所以业务接口中的
2. Spring 中使用 JDBC 编程示例
- 本地 mysql 建表
1 | CREATE TABLE `t_user` ( |
springDAO.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
User
1 | package com.data; |
BaseDAO
1 | package com.dao; |
UserDAO
1 | package com.dao; |
UserRowMapper
1 | package com.dao; |
BaseTestCase
1 | package com; |
TestUserDAO
1 | package com.dao; |